const KoaRouter = require('koa-router');
const md5 = require('md5');
const session = require('koa-session');
const { Sequelize } = require('sequelize')

/*
// 数据库连接，操作数据库，要操作数据库中的数据，
const Sequelize = require('sequelize')
const sequelize = new Sequelize('root', ''......)
// 定义模型
const UserModel = sequelize.define('user', {
  .....
})
*/

/*
在model文件夹内，存放的是所有的数据库表模型，
且有一个index，使用Users模型，Models.Users,
*/
const Models = require('../models')

const router = new KoaRouter()

router.get('/', async ctx => {
  // 操作数据库,获取数据库中的数据
  // 查询用户id为1的，并查询该用户对应的所有的发表内容数据
  // let data = await Models.Users.findByPk(1, {
  //   include: {
  //     model: Models.Comments
  //   }
  // })

  /*
  分页
  获取query传递的page，和perpage
  */
  let page = ctx.query.page || 1;
  let perpage = ctx.query.perpage || 2;
  let offset = (page-1)*perpage

  let data = await Models.Contents.findAndCountAll({
    limit: 2,
    offset,
    include: {
      model: Models.Users
    }
  })
  ctx.body = {
    code: 0,
    count: data.count,
    perpage,
    data: data.rows.map(d => {
      return {
        id: d.id,
        title: d.title,
        content: d.content,
        user_id: d.user_id,
        username: d.User.username,
        created_at: d.createdAt,
        like_count: d.like_count,
        comment_count: d.comment_count
      }
    }),
  }
})

router.post('/register', async (ctx, next) => {
  let username = ctx.request.body.username.trim()
  let password = ctx.request.body.password.trim()
  let repassword = ctx.request.body.repassword.trim()
  if(username == '' || password == '' || repassword == '') {
    return ctx.body = {
      code: 1,
      data: '用户名活密码不能为空'
    }
  }
  if(password !== repassword) {
    return ctx.body = {
      code: 2,
      data: '两次密码输入不一致'
    }
  }
  // 查询数据库中该username有没有被使用过
  let user = await Models.Users.findOne({
    where: {
      username
    }
  })
  console.log(user);
  if(user !== null) {
    return ctx.body = {
      code: 3,
      data: '当前用户已经被注册'
    }
  }
  // 注册成功，往users表中构建一个对象
  let newUser = await Models.Users.build({
    username,
    password
  }).save()
  // 注册成功，给前端返回数据
  ctx.body = {
    code: 0,
    data: {
      id: newUser.get('id'),
      username: newUser.get('username')
    }
  }
})

router.post('/login', async (ctx, next) => {
  let username = ctx.request.body.username.trim();
  let password = ctx.request.body.password.trim();
  let user = await Models.Users.findOne({
    where: {
      username
    }
  })
  if(user === null ) {
    return ctx.body = {
      code: 1,
      data: '不存在该用户'
    }
  }

  if(user.get('password') != password) {
    return ctx.body = {
      code: 1,
      data: '密码有误'
    }
  }

 
  // 登录成功之后设置cookie为id值，但cookie默认是js不能获取的
  // 只能通过协议请求,设置httponly：false可以通过js获取到cookie值
  // ctx.cookies.set('uid', user.get('id'), {
  //   httpOnly: false,
  //   maxAge: 10000, // 最长存储时间，单位为s
  //   // signed: true, // 一个布尔值, 表示是否要对 cookie 进行签名 (默认为 false). 
  // });


  /**
   * 服务端发送一个约定好的cookie，来表示当前是登录过的,
   * cookie可以传一个也可以传多个，设置好cookie之后，
   * 在responseHeaders中可以看到set-cookie的数据,
   * 且通过application可以查看当前存储的cookie数据
   */

  /**
   * requestHeaders是客户端发给服务端的请求，
   * 可以看到会自动携带cookie数据
   */
  // ctx.cookies.set('username', user.get('username'), {
  //   /**
  //    * httpOnly:表示当前的cookie是否允许客户端进行操作（js），
  //    * 如果为true，表示这个cookie只能通过用户http协议的数据传输
  //    */
  //   httpOnly: true
  // })
  // ctx.cookies.set('uid', user.get('id'), {
  //   httpOnly: false
  // })

  // ctx.session.uid = 1
  // ctx.session.userinfo='张三';

  ctx.body = {
    code: 0,
    data: {
      id: user.get('id'),
      username: user.get('username')
    }
  }

})

router.post('/like', async ctx => {
  let contentId = ctx.request.body.content_id;// 当前点赞的内容id
  let uid = ctx.request.body.uid; // 当前点赞用户的id
  // 判断用户是否登录

  // 获取当前被点赞内容--查看该内容是否存在，修改该条内容点赞数
  let content = await Models.Contents.findByPk(contentId)
  // 查看该内容是否存在，
  if(!content) {
    return ctx.body = {
      code: 1,
      data: '没有对应的内容'
    }
  }
  // 查询当前用户是否对该内容已经点赞了
  // select * from likes where content_id=1 and user_id=1
  let like = await Models.Likes.findOne({
    where: {
      [Sequelize.Op.and]: [
        { 'content_id': contentId },
        { 'user_id': uid }
      ]
    }
  })
  if(like) {
    return ctx.body = {
      code: 2,
      data: '已经点赞了'
    }
  }
  // 修改该条内容点赞数
  await content.set('like_count', content.get('like_count')+1).save()

  // 修改当前用户点赞信息
  await Models.Likes.build({
    content_id: contentId,
    user_id: uid
  }).save()

  ctx.body = {
    code: 0,
    data: content
  }
})

module.exports = router